package com.example.springboot.demo4;


import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.util.ClassUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.UUID;

@Controller
@ResponseBody   //这玩意不加不行
@RequestMapping("/controller")
public class MyController {

    @RequestMapping(value = "/hi")
    public String saiHi(){
        return "<h1>Hi,SpringMVC.</h1>";
    }

    @RequestMapping("/m1")  //url里面的键值对可以自动传参！！
    public String method_1(String name){
        return "<h1>Hi,"+name+".</h1>";
    }

    @RequestMapping("/m2")  //自动实现参数对象的复制！！
    public String method_2(User u1){
        return "<h1>I am "+u1.getName()+",I am "+u1.getAge()+" years old.</h1>";
    }

    @RequestMapping("/m3")  //from表单参数传递！！
    //还只能传递String 类型！
    public String method_3(String name,String age){
        return "<h1>I am "+name+",I am "+age+" years old.</h1>";
    }


    //上面几种情况，都是建立在前端传递的键值对Key名称和后端接受的变量名保持一致的前提，如果名称不一致，该如何用映射呢？




    @RequestMapping("/m4")
    //这里只能接收url里面的参数！
    //如果url里面没有time,默认就会报400，required=false之后，找不到time也不会报400
    //如果是使用from表单的形式传递time,他也是接收不到的！
    //问？from表单和url键值对的区别！
    public String method_4(@RequestParam(value = "time",required = false) String createtime){
        return createtime;
    }


    //传递json格式

    // @RequestBody  这个东西的作用，课件也没解释清除！

    //这里面又牵扯到类型的问题，User的姓名是String类型，年俩是int类型！
    //json传递过来的数据是什么类型呢？？应该都是String吧！如果age字符串无法正常解析为int，那么构建对象u1就会失败！
    @RequestMapping(value = "/m5",method = RequestMethod.POST)
    public String method_5(@RequestBody User u1){
        System.out.println("Person: " + u1);
        return "122";
    }






    //获取URL中参数@PathVariable
    //根据代码演示，获取URL参数里的参数：
    //Post,Get都可以
    @GetMapping("/m6/{name}/{password}")
    public String method_6(@PathVariable String name, @PathVariable String password){
        System.out.println("name:"+name);
        System.out.println("password:"+password);
        return "123";
    }

    @RequestMapping("/m7") //怎么设置上传的文件大小！
    public String method_7(String name, @RequestPart("myfile") MultipartFile file) throws IOException {


        //我要保存这个文件，那么文件的格式（后缀）就不能写死，需要获取文件的后缀名称！
        String fileName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
        //文件保存地址：(这里要注意一下！)

        //这个是上传到target里面去了！

        //getResource("static")这个是干啥用的？为什么要加参数！
        String filePath = ClassUtils.getDefaultClassLoader().getResource("").getPath() +
                "/" + UUID.randomUUID() + fileName;
        //保存文件
        file.transferTo(new File(filePath));
        return filePath + "上传成功.";
    }



    //简洁地 获取 Request 和 Response 对象
    @RequestMapping("/m8")
    //如何构造cookie,因为cookie是保存在浏览器里面的，这个不方便设置！
    public String method_8(@CookieValue("name") String username){
        return username + " 你好 .";
    }


    //简洁地获取Header （1）
    @RequestMapping("/m9")
    public String method_9(@RequestHeader(value = "User-Agent",required = false) String userAgent) {
        return "userAgent:"+userAgent;
    }
    //简洁地获取Header （2）
    @RequestMapping("/m9_2")
    public String method_9_2(@RequestHeader(value = "Host",required = false) String userAgent) {
        return "Host:"+userAgent;
    }
    //根数上述m9的演示可以看出
    //@RequestHeader(value = "Host",required = false)中的value是header键值对中的键，不是随意写的！




    //获取 Session 更简洁的⽅式：

    //怎么更简单的设置session呢？？

    //这个也不好测试？我想要获取session就必须要先存储session
    @RequestMapping("/setSess")
    public String setSess(HttpServletRequest request) {
                //获取HttpSession对象，参数设置为true表示如果没有session对象就创建⼀个session
        HttpSession session = request.getSession(true);
        if(session!=null){
            session.setAttribute("username","java");
        }
        return "session 存储成功 ";
    }

    @RequestMapping("getSess")
    public String getSess(@SessionAttribute(value = "username",required = false) String username){
        return "username："+username;
    }



    //前面有一个方法是获取前端传递过来的json数据
    //方法12是返回一个json格式格式数据！
    //我也没有设置什么参数呀！是他自己自动返回json的！
    //SpringMVC会自动设置返回的数据格式json ,text,html等等
    @RequestMapping("/m12")
    public HashMap<String, String> method_12(){
        HashMap<String, String> map = new HashMap<>();
        map.put("Java", "Java Value");
        map.put("MySQL", "MySQL Value");
        map.put("Redis", "Redis Value");
        return map;
    }


    @RequestMapping(value = "/login")
    public HashMap<String,Object> login(String username, String password){
        HashMap<String,Object> res = new HashMap<>();
        int succ = 200;
        if(username!=null && password!=null &&
                username.equals("admin") && password.equals("admin")){
            res.put("msg"," 登录成功 ");
        }else{
            res.put("msg"," 登录失败 ");
        }
        res.put("succ",succ);
        return res;
    }

}
